/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package businessDelegate;

import AccesoEJB.EJBLogica;
import AccesoWS.WSAerolinea;
import AccesoWS.WSRestaurante;
import AccesoWS.WSTeatro;
import Beans.LogicaRemote;
import DTOs.DTOAerolinea;
import DTOs.DTOHotel;
import VOs.Reserve;

import DTOs.DTORestaurante;
import DTOs.DTOTeatros;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import java.util.Date;
import java.util.List;

import javax.naming.NamingException;

/**
 *
 * @author williamprado
 */

public class BusinessDelegate {

    public String verreserva(int idreserva, int idexterno){
        return "hola";
    }

    public List<VOs.Reserve> reservasCliente(String id) throws Exception{
        AccesoEJB.EJBLogica logica = new EJBLogica();
        List<VOs.Reserve> res = new ArrayList<Reserve>();
        try{
            int idi= Integer.parseInt(id);
            res = logica.findReserveByPlan(idi);
        }catch(Exception e){
            throw new Exception("ERROR: No es posible realizar la acción");
        }
        return res;
    }
    public List<VOs.Plan> planesCliente(String id)throws Exception{
        AccesoEJB.EJBLogica logica = new EJBLogica();
        try {
            return logica.getallPlanbyUser(id);
        } catch (Exception ex) {
            throw new Exception("ERROR: No es posible realizar la acción");
        }
    }

    public ArrayList<Integer> planesTamplanes(List<VOs.Plan> planes)throws Exception{
        AccesoEJB.EJBLogica logica = new EJBLogica();
        ArrayList<Integer> tamanos= new ArrayList<Integer>();
        try {
            for(int i=0;i<planes.size();i++){
                int a = planes.get(i).getIdPlan().intValue();
                tamanos.add(logica.TotalReserveByPlan(a));
            }
            //throw new Exception("ERROR: No es posible realizar la acción");
            return tamanos;
        } catch (NamingException ex) {
            throw new Exception("ERROR: No es posible realizar la acción");
        }
    }

    public VOs.Users traerUsuario(String id) throws Exception{
        AccesoEJB.EJBLogica logica = new EJBLogica();
        try {
            return logica.getUser(id);
        } catch (Exception ex) {
             throw new Exception("ERROR: No es posible realizar la acción");
        }
    }
    public boolean userLogin(String login, String password) throws NamingException, Exception{
        AccesoEJB.EJBLogica logica = new EJBLogica();

         return logica.checklogin(login, password);
    }

    public boolean adminLogin(String login, String password) throws NamingException{
        AccesoEJB.EJBLogica logica = new EJBLogica();
        return logica.checkAdminLogin(login, password);
    }

    public List<VOs.City> getAllCities() throws Exception{
        AccesoEJB.EJBLogica logic = new EJBLogica();
        List<VOs.City> allCities = null;
        try{
            allCities = logic.findallCity();
            return allCities;
        }catch(Exception e){
            throw new Exception("ERROR: No se pudo obtener la lista de ciudades");
        }
    }

    public List<DTOs.DTOTeatros> getPresentationsByDate(String date) throws Exception{
        //AccesoEJB.EJBLogica logic = new EJBLogica();
        List<DTOs.DTOTeatros> presentations = new ArrayList<DTOs.DTOTeatros>();
        try{
            //presentations = logic.findPresentationsByDate(date);
            /*System.out.println("Vamos a buscar, primero creamos el objeto a");
            DTOTeatros a = new DTOs.DTOTeatros();
            System.out.println("vamos a setear datos basicos.");
            a.setNombre("El Cojote y Juancho Panza");
            a.setId(1);
            a.setHora("4 pm");
            a.setFecha(new Date());
            a.setDuracion("1 Hora");
            a.setCuposdisponibles1(20);
            a.setCuposdisponibles2(40);
            a.setCuposdisponibles3(30);
            a.setCosto1(20.5);
            a.setCosto2(18.60);
            a.setCosto3(15.92);
            DTOTeatros b = new DTOs.DTOTeatros();
            b.setNombre("Rumba en la Whiskeria de Lunares");
            b.setId(2);
            b.setHora("11 am");
            b.setFecha(new Date());
            b.setDuracion("4 Horas");
            b.setCuposdisponibles1(10);
            b.setCuposdisponibles2(20);
            b.setCuposdisponibles3(30);
            b.setCosto1(14);
            b.setCosto2(7.54);
            b.setCosto3(17.64);
            DTOTeatros c = new DTOs.DTOTeatros();
            c.setNombre("El Ajedrez de la Vida.");
            c.setId(3);
            c.setHora("4 pm");
            c.setFecha(new Date());
            c.setDuracion("2 Horas y 30 min");
            c.setCuposdisponibles1(15);
            c.setCuposdisponibles2(10);
            c.setCuposdisponibles3(0);
            c.setCosto1(35.5);
            c.setCosto2(20.54);
            c.setCosto3(18.54);
            System.out.println("vamos a agregar las presentaciones.");
            presentations.add(a);
            presentations.add(b);
            presentations.add(c);
            System.out.println("vamos a retornar las presentaciones.");*/
            String[] dateSplitted = date.split("/");
            presentations = WSTeatro.getpresentacion(Integer.parseInt(dateSplitted[2]), Integer.parseInt(dateSplitted[0]), Integer.parseInt(dateSplitted[1]));
            return presentations;
        }catch(Exception e){
            throw new Exception("ERROR: No se pudo obtener la lista de presentaciones");
        }
    }

    public List<VOs.Country> getAllCountries() throws Exception{
        AccesoEJB.EJBLogica logic = new EJBLogica();
        List<VOs.Country> allCountries = null;
        try{
            allCountries = logic.findallCountries();
            return allCountries;
        }catch(Exception e){
            throw new Exception("ERROR: No se pudo obtener la lista de paises");
        }
    }

    public List<VOs.City> getCitiesByCountry(String country) throws Exception{
        AccesoEJB.EJBLogica logic = new EJBLogica();
        List<VOs.City> countryCities = null;
        try{
            countryCities = logic.findCitybyCountry(country);
            return countryCities;
        }catch(Exception e){
            throw new Exception("ERROR: No se pudo obtener la lista de ciudades");
        }
    }
    //nito metodo que traiga info usuarios
//    public VOs.Users verUsuario(String id){
//        AccesoEJB.EJBLogica logica = new EJBLogica();
//        logica.
//    }

    //editarcrearUsuario        (idusuario, nombre, apellido, mail, tell, creditcard, pass1, pass2);
    public boolean crearUsuario(String idUsuario, String nombre, String apellido, String mail, String tell, String creditcard,String pass1,String pass2, String cedula) throws Exception{
        System.out.println(mail);
        System.out.println(pass1);
        if(idUsuario==null|| nombre==null||apellido==null||mail==null||tell==null ||creditcard==null
                ||pass1.equals("d41d8cd98f00b204e9800998ecf8427e")||pass2.equals("d41d8cd98f00b204e9800998ecf8427e")
                ||idUsuario.equals("")||nombre.equals("")||apellido.equals("")||mail.equals("")||tell.equals("")||creditcard.equals("")){
            throw new NullPointerException("ERROR: Todos los campos son obligatorios");
        }
        if(!pass1.equals(pass2)){
            throw new IllegalArgumentException("ERROR: Las contraseñas no son iguales");
        }
        AccesoEJB.EJBLogica logica = new EJBLogica();
        try{
            int a = Integer.parseInt(cedula);
        }catch(Exception e){
            throw new Exception("ERROR: La cedula solo puede tener numeros");
        }
        try{
            boolean a = WSAerolinea.crearclienteaerolinea(idUsuario, pass2, nombre, apellido, tell);
            if(!a){
                throw new Exception("ERROR: No se pudo crear el usuario en la aerolinea");
            }
            System.out.println(WSAerolinea.getclienteaerolinea(idUsuario).getNombre());
            return logica.createUsers(idUsuario, nombre, apellido,tell, pass1, creditcard, mail, cedula);//logica.crearusuario(idUsuario, pass2, tipo, nombre, apellido, mail);
        }catch(Exception ex){
            throw new Exception("ERROR: No se pudo crear el usuario");
        }
    }

    public boolean crearUsuarioStandAlone(String idUsuario, String nombre, String apellido, String mail, String tell, String creditcard,String pass, String cedula) throws Exception{
        AccesoWS.WSAerolinea aero = new AccesoWS.WSAerolinea();
        AccesoWS.WSHotel hotel = new AccesoWS.WSHotel();
        AccesoWS.WSRestaurante rest = new AccesoWS.WSRestaurante();
        AccesoWS.WSTeatro teat = new AccesoWS.WSTeatro();
        boolean aeroC = false;
        boolean existsAero = false;
        boolean hotelC = false;
        boolean existsHotel = false;
        boolean restC = false;
        boolean existsRest = false;
        boolean teatC = false;
        boolean existsTeat = false;
        boolean error = false;        
        aerolinea.Cliente a = new aerolinea.Cliente();
        webservices.FinaluserVo h = new webservices.FinaluserVo();
        restaurante.ClienteVO r = new restaurante.ClienteVO();
        teatro.Cliente t = new teatro.Cliente();
        String idCAero = "";
        String idCHotel = "";
        String idCRest = "";
        String idCTeat = "";
        Long idClTeatro = Long.parseLong("-1");
        try{
            a = aero.getclienteaerolinea(cedula);
            if(a!=null && a.getLogin().equals(cedula)){existsAero = true;}else if(a==null){error=true;}
        }catch(Exception exa){
            error = true;
        }
        try{
            h = hotel.consultarUsuario(cedula);
            if(h!=null && h.getIdentification().equals(cedula)){existsHotel = true;}else if(h==null){error=true;}
        }catch(Exception exb){
            error = true;
        }
        try{
            r = rest.getClienteVObyId(Integer.parseInt(cedula));
            if(r!=null && r.getCedula() == Integer.parseInt(cedula)){existsRest = true;}else if(r==null){error=true;}
        }catch(Exception exc){
            error = true;
        }
        try{
            t = teat.buscarCientePorNombreUsr(cedula);
            if(t!=null && t.getId() == Long.parseLong(cedula)){existsTeat = true;}else if(t==null){error=true;}
        }catch(Exception exd){
            error = true;
        }
        if(error){
            throw new Exception("ERROR: ocurrio un error con los proveedores");
        }else{
            if(existsAero){
                idCAero = a.getLogin();
            }else{
                try{
                    aeroC = aero.crearclienteaerolinea(cedula, pass, nombre, apellido, tell);
                }catch(Exception exe){
                    throw new Exception("ERROR: ocurrio un error registrando en la aerolinea");
                }
                idCAero = cedula;
            }
            if(existsHotel){
                idCHotel = h.getUserName();
            }else{
                try{
                    hotelC = hotel.crearUsuario(cedula, idUsuario, pass, nombre, apellido, mail, creditcard, tell, 1);
                }catch(Exception exf){
                    throw new Exception("ERROR: ocurrio un error registrando en el hotel");
                }
                idCHotel = cedula;
            }
            if(existsRest){
                idCRest = r.getCedula().toString();
            }else{
                try{
                    rest.saveCliente(Integer.parseInt(cedula), mail, nombre, pass, Integer.parseInt(tell));
                }catch(Exception exg){
                    throw new Exception("ERROR: ocurrio un error registrando en el restaurante");
                }
                idCRest = cedula;
            }
            if(existsTeat){
                idCTeat = t.getNombre();
            }else{
                try{
                    teat.agregarclienteteatro(cedula, mail, "City", "Country", tell);
                }catch(Exception exh){
                    throw new Exception("ERROR: ocurrio un error registrando en el teatro");
                }
                idCTeat = cedula;
            }
            if(!idCAero.equals("") && idCAero.equals(idCHotel) && idCHotel.equals(idCRest) && idCRest.equals(idCTeat)){
                return true;
            }
        }return false;
    }

    //editarcrearUsuario        (idusuario, nombre, apellido, mail, tell, creditcard, pass1, pass2);
    public boolean editarUsuario(String idUsuario, String nombre, String apellido, String mail, String tell, String creditcard, String pass0, String pass1, String pass2) throws Exception{
        boolean edit;
        boolean aux=true;
        System.out.println("edit usuer "+idUsuario+" "+nombre+" "+apellido+" "+mail+" "+tell+" "+pass0);
        edit = verificacion(idUsuario, nombre, apellido, mail, tell, creditcard, pass0, pass1, pass2);
        String pasu="";
        if(edit){
            pasu=pass1;
            //agregar funcion de edicion de usuario
        }else{pasu=pass0;}
        //agreagr funcion de edicion de datos
            AccesoEJB.EJBLogica logica = new EJBLogica();
            return logica.editUsers(idUsuario, nombre, apellido, tell, pasu, creditcard, mail);
    }

    private boolean verificacion(String idUsuario, String nombre, String apellido, String mail, String tell, String creditcard,String pass0, String pass1,String pass2)throws Exception{
        boolean cambio=true;
        if(idUsuario==null|| nombre==null||apellido==null||mail==null||tell==null||creditcard==null||pass0.equals("d41d8cd98f00b204e9800998ecf8427e")
                ||idUsuario.equals("")||tell.equals("")||nombre.equals("")||apellido.equals("")||mail.equals("")||creditcard.equals("")){
            throw new NullPointerException("ERROR: Hay campos vacios");
        }
        if(!pass1.equals(pass2)){
            throw new Exception("ERROR: Las contraseñas no coinciden");
        }
        if(!userLogin(idUsuario, pass0)){
            throw new Exception("ERROR: La contraseña es incorrecta");
        }
        if((pass1.equals("d41d8cd98f00b204e9800998ecf8427e")&&pass2.equals("d41d8cd98f00b204e9800998ecf8427e"))){
            cambio=false;
        }
        return cambio;
    }

    public List<DTOs.DTOAerolinea> vuelosDisponibles(String fecha, int idCiudad1, int idciudad2, boolean forma) throws Exception{
        List<DTOs.DTOAerolinea> a = null;
        int year, month, day;

        try {
            String [] fecha1 = fecha.split("/");
            day =Integer.parseInt(fecha1[1]);
            month =Integer.parseInt(fecha1[0]);
            year = Integer.parseInt(fecha1[2]);
            System.out.println(day);
            System.out.println(month);
            System.out.println(year);
            if(!forma){
                a = AccesoWS.WSAerolinea.getVuelosvista(year, month, day);
            }else{
                a = AccesoWS.WSAerolinea.getVuelosvista(idCiudad1, idciudad2, year, month, day);
            }
        } catch (Exception ex) {
            throw new Exception("ERROR: No se pudo realizar la busqueda");
        }
        return a;
    }

    public List<DTOs.DTOHotel> hotelesDisponibles() throws Exception{
        List<DTOs.DTOHotel> hotelsList = null;
        hotelsList = AccesoWS.WSHotel.getAvailableRooms();

        return hotelsList;
    }

    private static Date Fecha(String fechax){
        Date fecha = new Date();
        String [] fecha1 = fechax.split("/");
        fecha.setDate(Integer.parseInt(fecha1[1]));
        fecha.setMonth(Integer.parseInt(fecha1[0])-1);
        int ano =Integer.parseInt(fecha1[2])-1900;
        fecha.setYear(ano);
        return fecha;
    }

    public List<DTORestaurante> getMesasByDate(String date) throws Exception {
        //AccesoEJB.EJBLogica logic = new EJBLogica();
        List<DTOs.DTORestaurante> mesas = new ArrayList<DTOs.DTORestaurante>();
        try{
            //presentations = logic.findPresentationsByDate(date);
            /*
            DTOs.DTORestaurante a = new DTORestaurante();
            a.setAll("Fonda donde Chucho", 2, "Calle Siempre Viva", "BigPower", 5, 3, "Comilones", "Una Mesa Perfecta para aquellos del buen gusto y comer.");
            DTOs.DTORestaurante b = new DTORestaurante();
            b.setAll("Fonda donde Chucho", 2, "Calle Siempre Viva", "BigPower", 5, 3, "Comilones", "Una Mesa Perfecta para aquellos del buen gusto y comer.");
            DTOs.DTORestaurante c = new DTORestaurante();
            c.setAll("Fonda donde Chicho", 2, "Calle Siempre Viva", "BigPower", 5, 3, "Comilones", "Una Mesa Perfecta para aquellos del buen gusto y comer.");
            DTOs.DTORestaurante d = new DTORestaurante();
            d.setAll("Fonda donde Chicho", 2, "Calle Siempre Viva", "BigPower", 5, 3, "Comilones", "Una Mesa Perfecta para aquellos del buen gusto y comer.");
            DTOs.DTORestaurante e = new DTORestaurante();
            e.setAll("Fonda donde Chicho", 2, "Calle Siempre Viva", "BigPower", 5, 3, "Comilones", "Una Mesa Perfecta para aquellos del buen gusto y comer.");
            DTOs.DTORestaurante f = new DTORestaurante();
            f.setAll("Fonda donde Chicho", 2, "Calle Siempre Viva", "BigPower", 5, 3, "Comilones", "Una Mesa Perfecta para aquellos del buen gusto y comer.");
            mesas.add(a);
            mesas.add(b);
            mesas.add(c);
            mesas.add(d);
            mesas.add(e);
            mesas.add(f);*/
            System.out.println("vamos a retornar las mesas.");
            String[] dateSplitted = date.split("/");
            mesas = WSRestaurante.getMesasbyFecha(Integer.parseInt(dateSplitted[2]), Integer.parseInt(dateSplitted[0]), Integer.parseInt(dateSplitted[1]));
            return mesas;
        }catch(Exception e){
            throw new Exception("ERROR: No se pudo obtener la lista de Restaurantes");
        }
    }

    public boolean reservar(String username, List<DTOAerolinea> dtoa, List<DTOHotel> dtoh, List<DTORestaurante> dtor, List<DTOTeatros> dtot) {
        try{
            AccesoEJB.EJBLogica ejbl = new EJBLogica();
            VOs.Plan plan = ejbl.createPlan2(username);
            //Reservando en Aerolinea
            for(int i=0;i<dtoa.size();i++){
                //aerolinea.Reserva reserva = WSAerolinea.reservar(username,Integer.parseInt(dtoa.get(i).getIdvuelo()+""),dtoa.get(i).getFecha().getYear(),dtoa.get(i).getFecha().getMonth(),dtoa.get(i).getFecha().getDate());
                //ejbl.createReserve(plan.getIdPlan(), 1, reserva., reserva, reserva);
            }
            return true;
        }catch(Exception e){
            return false;
        }
    }
}
